package cn.yh.shop.admin.service.impl;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import cn.yh.shop.admin.dao.MenuDao;
import cn.yh.shop.admin.model.Menu;
import cn.yh.shop.admin.service.IAdminService;
import cn.yh.shop.admin.service.IMenuService;
import cn.yh.shop.admin.service.IRoleMenuService;
import cn.yh.shop.util.Constant.MenuType;

/** 
*@Description:IMenuService的实现类
* @author  "许荣斐"
* @time:2016年12月20日 下午1:24:34
* @version 1.0 
*/
@Service("menuService")
public class MenuServiceImpl implements IMenuService {

	@Autowired
	private MenuDao MenuDao;
	@Autowired
	private IAdminService adminService;
	@Autowired
	private IRoleMenuService roleMenuService;
	
	/*
	 * 根据父菜单，查询子菜单
	 */
	@Override
	public List<Menu> queryListParentId(Integer parentId, List<Integer> menuIdList) {
		List<Menu> menuList = MenuDao.queryListParentId(parentId);
		if(menuIdList == null){
			return menuList;
		}
		
		List<Menu> userMenuList = new ArrayList<>();
		for(Menu menu : menuList){
			if(menuIdList.contains(menu.getMenuId())){
				userMenuList.add(menu);
			}
		}
		//userMenuList第一次遍历,返回的是一级菜单
		return userMenuList;
	}

	/* 
	 * 获取不包含按钮的菜单列表
	 */
	@Override
	public List<Menu> queryNotButtonList() {
		return MenuDao.queryNotButtonList();
	}

	@Override
	public List<Menu> getUserMenuList(Integer adminId) {
		//系统管理员，拥有最高权限
		if(adminId == 2){
			return getAllMenuList(null);
		}
		
		//用户菜单列表
		List<Integer> menuIdList = adminService.queryAllMenuId(adminId);
		return getAllMenuList(menuIdList);
	}
	
	/**
	 * @Description:根据id查询单个实体
	 * @param menuId
	 * @author: "许荣斐"
	 * @time:2016年12月20日 下午1:31:26
	 */
	@Override
	public Menu queryObject(Integer menuId) {
		return MenuDao.queryObject(menuId);
	}

	@Override
	public List<Menu> queryList(Map<String, Object> map) {
		return MenuDao.queryList(map);
	}

	@Override
	public int queryTotal(Map<String, Object> map) {
		return MenuDao.queryTotal(map);
	}

	@Override
	public void save(Menu menu) {
		MenuDao.save(menu);
	}

	@Override
	public void update(Menu menu) {
		MenuDao.update(menu);
	}

	@Override
	@Transactional
	public void deleteBatch(Integer[] menuIds) {
		MenuDao.deleteBatch(menuIds);
	}
	
	/**
	 * 获取所有菜单列表
	 */
	private List<Menu> getAllMenuList(List<Integer> menuIdList){
		//查询'根菜单'列表
		List<Menu> menuList = queryListParentId(0, menuIdList);
		//递归获取子菜单
		getMenuTreeList(menuList, menuIdList);
		
		return menuList;
	}

	/**
	 * 递归
	 *
	 **/
	private List<Menu> getMenuTreeList(List<Menu> menuList, List<Integer> menuIdList){
		List<Menu> subMenuList = new ArrayList<Menu>();
		
		for(Menu entity : menuList){
			if(entity.getType() == MenuType.CATALOG.getValue()){//目录
				entity.setList(getMenuTreeList(queryListParentId(entity.getMenuId(),null), menuIdList));
			}
			subMenuList.add(entity);
		}
		
		return subMenuList;
	}
	

}
